﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace WebApplication1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //开始执行 执行下面定义的CreateWebHostBuilder()方法 返回一个IWebHostBuilder 类型的值
            //然后开始执行Build()方法，这个方法是IWebHostBuilder 类内定义的方法。
            //Build()方法，-->作用:创建一个IWebHost类来装载web应用服务,返回一个IWebHost 类型的值，继承了IDisposable类

            //然后执行Run()方法  这个Run()方法参数中带有this 关键字  是一个扩展方法。
           // 方法中加this （加入这个命名空间后，所有IHost类型都能调用这个方法）;
           //应用程序启动时(即执行以下Run()方法时)调用Startup 类
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            // WebHost 是Microsoft.AspNetCore 内部的一个类  修饰符是internal 
            // 继承了 IWebHost,IAsyncDisposable 接口

            //CreateDefaultBuilder 是一个方法 返回 IHostBuilder 类型的值 
            /*
             * 方法内实例化了一个HostBuilder 类 builder
             * 然后调用了以下几个方法
             * UseContentRoot()方法-->作用:指定WebHost使用的Content root(内容根目录)
             * UsefigureHostConfiguration() -->作用:启动主机需要的环境变量等相关
             * ConfigureAppConfiguration()--> 作用:设置当前应用程序配置，主要是读取 appsetting.json 配置文件
             * ConfigureLogging()--> 作用:读取配置文件中的Logging节点，配置固态系统
             * UseDefaultServiceProvider()-->作用:设置读取的依赖注入容器
             */
            //接下来执行 UseStartup<>() 方法--> 作用:指定web主机要使用的启动类型   返回类型为IWebHostBuilder 类型的值
            //执行完这一套流程后执行Main方法中的 Build 方法
             WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}
